using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;
using System.Data;
using EntGuayasSLA.BL.Listas.Criterias;

namespace EntGuayasSLA.BL
{
    [Serializable]
    public class Secuencia : BusinessBase<Secuencia>
    {
        #region Business Methods

        public static readonly PropertyInfo<int> AnyoProperty = RegisterProperty<int>(p => p.Anyo);
        public int Anyo
        {
            get { return GetProperty(AnyoProperty); }
            set { SetProperty(AnyoProperty, value); }
        }
        public static readonly PropertyInfo<int> NumeroProperty = RegisterProperty<int>(c => c.Numero);
        public int Numero
        {
            get { return GetProperty(NumeroProperty); }
            set { SetProperty(NumeroProperty, value); }
        }
        public static readonly PropertyInfo<string> JefaturaProperty = RegisterProperty<string>(c => c.Jefatura);
        public string Jefatura
        {
            get { return GetProperty(JefaturaProperty); }
            set { SetProperty(JefaturaProperty, value); }
        }

        #endregion

        #region Business Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            base.AddBusinessRules();

            //BusinessRules.AddRule(new Rule(IdProperty));
        }

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //BusinessRules.AddRule(...);
        }

        #endregion

        #region Factory Methods
        /*
        public static Secuencia NewEditableRoot()
        {
            return DataPortal.Create<Secuencia>();
        }
        */
        public static Secuencia GetEditableRoot(int idAnyo, string idJefatura,string ifSecuencia)
        {
            SecuenciaCriteria criteria = SecuenciaCriteria.NewSecuenciaCriteria();
            criteria.Anyo           = idAnyo;
            criteria.Jefatura       = idJefatura;
            criteria.CrearSecuencia = ifSecuencia;
            return DataPortal.Fetch<Secuencia>(criteria);
        }
        /*
        public static void DeleteEditableRoot(int id)
        {
            DataPortal.Delete<Secuencia>(id);
        }
        */
        private Secuencia()
        { /* Require use of factory methods */ }

        #endregion

        #region Data Access

        [RunLocal]
        /*
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }
        */
        private void DataPortal_Fetch(SecuenciaCriteria criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { new Parametro("ec_anyo",criteria.Anyo) ,
                new Parametro("ec_jefatura", criteria.Jefatura),
                new Parametro("ec_secuencia", criteria.CrearSecuencia),
            
            };
            DataSet datos = accesoDatos.EjecutarDataSet("\"OBT_SECUENCIA\"", parametros);
            if (datos.Tables[0].Rows.Count > 0)
            {
                int numberTry = 0;
                int.TryParse(datos.Tables[0].Rows[0][0].ToString(),out numberTry);
                LoadProperty(AnyoProperty, numberTry);
                int.TryParse(datos.Tables[0].Rows[0][1].ToString(), out numberTry);
                LoadProperty(NumeroProperty,numberTry);
                LoadProperty(JefaturaProperty, datos.Tables[0].Rows[0][2].ToString());
            }
        }
        /*
        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_rol_id", ReadProperty(AnyoProperty)),
                new Parametro("ec_usr_id", ReadProperty(NumeroProperty)),
                new Parametro("ec_rol_nombre", ReadProperty(JefaturaProperty))
            };
            accesoDatos.EjecutarQuery("INS_SECU", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_rol_id", ReadProperty(AnyoProperty)),
                new Parametro("ec_usr_id", ReadProperty(NumeroProperty)),
                new Parametro("ec_rol_nombre", ReadProperty(JefaturaProperty))
            };
            accesoDatos.EjecutarQuery("ACT_SECU", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(this.Anyo);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(int criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_rol_id", ReadProperty(AnyoProperty))
            };
            accesoDatos.EjecutarQuery("ELI_SECU", parametros);
        }
        */
        #endregion
    }
}
